/**
* Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.seedstack.io.internal;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.name.Names;
import org.apache.commons.lang.StringUtils;
import org.seedstack.io.Parser;
import org.seedstack.io.Parsers;
import org.seedstack.io.spi.AbstractTemplateParser;
import org.seedstack.io.spi.Template;
import org.seedstack.io.spi.TemplateLoader;
import org.seedstack.seed.SeedException;
import javax.inject.Inject;
import java.util.List;
import java.util.Map;
class ParsersInternal implements Parsers {
private static final String TEMPLATE = "template";
private final List<TemplateLoader<?>> templateLoaders;
private final Map<String, Class<Parser>> parsers;
@Inject
private Injector injector;
ParsersInternal(List<TemplateLoader<?>> templateLoaders, Map<String, Class<Parser>> parsers) {
this.templateLoaders = templateLoaders;
this.parsers = parsers;
}
@SuppressWarnings({"unchecked", "rawtypes"})
@Override
public Parser getParserFor(String templateName) {
// Finds the template loader associated to the given template name
TemplateLoader<?> templateLoader = null;
for (TemplateLoader<?> tl : templateLoaders) {
if (tl.contains(templateName)) {
templateLoader = tl;
break;
}
}
// For parsers with template
if (templateLoader != null) {
if (StringUtils.isBlank(templateLoader.templateParser())) {
throw SeedException.createNew(IoErrorCode.NO_PARSER_FOUND)
.put(TEMPLATE, templateName);
}
Parser parser = injector.getInstance(Key.get(Parser.class, Names.named(templateLoader.templateParser())));
Class<?> parserClazz = parsers.get(templateLoader.templateParser());
if (AbstractTemplateParser.class.isAssignableFrom(parserClazz)) {
// Loads the template and initializes the parser
Template template;
try {
template = templateLoader.load(templateName);
((AbstractTemplateParser) parser).setTemplate(template);
// Catch all possible fails when fail to load a template
} catch (Exception e) {
throw SeedException.wrap(e, IoErrorCode.ERROR_LOADING_TEMPLATE)
.put(TEMPLATE, templateName);
}
}
return parser;
} else {
try {
return injector.getInstance(Key.get(Parser.class, Names.named(templateName)));
} catch (Exception e) {
throw SeedException.wrap(e, IoErrorCode.NO_TEMPLATE_FOUND_EXCEPTION)
.put(TEMPLATE, templateName);
}
}
}
}